/*
 * @Author       : liujun
 * @Date         : 2022-11-04 09:44:00
 * @LastEditors  : liujun
 * @LastEditTime : 2022-08-17 17:15:20
 * @FilePath     : /vue_template_webpack-vite/src/utils/downloadFile.ts
 * @Description  : 文件下载
 */

/**
 * 另存为
 * @param {Blob} blob: 文件流
 * @param {string} fileName: 文件名称
 */
 export let saveAsWithBlob = (blob, fileName) => {
    // 创建 a标签，并配置 对应信息
    const tmpa = document.createElement("a");
    tmpa.download = fileName || "下载";
    // 通过文件流创建 路径信息
    tmpa.href = URL.createObjectURL(blob);
    // 触发点击事件(下载)
    tmpa.click();
    // 移出 创建资源
    setTimeout(() => {
      URL.revokeObjectURL(tmpa.href);
    }, 100);
  };
  
  /**
   * 另存为(通过 下载链接 下载)
   * @param {string} url: 文件地址(可通过当前地址直接访问文件)
   * @param {string} fileName: 文件名称
   */
  export const saveAsWithUrl = (url, fileName) => {
    // 创建 a标签，配置对应 下载地址、下载文件名称
    const tmpa = document.createElement("a");
    tmpa.download = fileName || "下载";
    tmpa.href = url;
    // 触发下载
    tmpa.click();
  };
  
  /**
   * download 文件下载
   * @param {string} url: 文件地址
   */
  export const iframeDownload = (url) => {
    // 通过 iframe的方式，完成文件下载
    const iframe = document.createElement("iframe");
    iframe.style.display = "none";
    iframe.src = url;
    iframe.onload = function () {
      document.body.removeChild(iframe);
    };
    document.body.appendChild(iframe);
  };
  
  /** 根据 请求地址 获取文件流，并进行下载保存 ⬇️
   ***************************************************/
  /**
   * 提供文件路径，另存为
   * @param {string} url:地址
   * @param {string} fileName: 文件名称
   */
  export const saveAsFromUrl = (url, fileName) => {
    getBlob(url).then((blob) => {
      saveAsWithBlob(blob, fileName);
    });
  };
  
  /**
   * 根据 url请求地址 获取文件流
   * @param {string} url: 请求地址
   * @return {Promise<Blob>} 获取结果
   */
  export const getBlob = (url) => {
    return new Promise((resolve) => {
      const xhr = new XMLHttpRequest();
      xhr.open("GET", url, true);
      xhr.responseType = "blob";
      xhr.onload = () => {
        if (xhr.status === 200) {
          resolve(xhr.response);
        }
      };
      xhr.send();
    });
  };
  /** 根据 请求地址 获取文件流，并进行下载保存 ⬆️
   ***************************************************/
  